home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Die Speccy' 97
/
Die Speccy' 97.iso
/
amiga_system
/
the_aminet
/
util
/
boot
/
snap_v2_0.lha
/
Snap
/
Windows.c
< prev
Wrap
C/C++ Source or Header
|
1995-09-10
|
13KB
|
695 lines
/* Auto: make "CCEXTRA=-wq -qf"
*/
#include "Snap.h"
IMPORT BOOL Kick36;
struct Window *ControlWindow = NULL;
extern char Version[];
IMPORT struct MsgPort *Sharedport;
IMPORT WORD Sharedrefs;
IMPORT struct Window *SaveWin;
IMPORT LONG TopBar;
IMPORT LONG LeftBar;
IMPORT LONG RightBar;
IMPORT LONG BottomBar;
IMPORT LONG ScreenFontHeight;
IMPORT struct TextFont *ScreenFont;
IMPORT struct RastPort MyRP;
#define IDCMPFLAGS (MOUSEMOVE | NEWSIZE | CLOSEWINDOW | GADGETUP | ACTIVEWINDOW | INACTIVEWINDOW | MOUSEBUTTONS)
UBYTE *WindowTitle = (UBYTE *) Version[ 5];
/* Important!
* The Inactive Image structs contains the values to be used with Kickstart >= 36.
* The Active Image structs contains the values to be used with Kickstart < 36.
* The Image structs are copied accordingly in OpenStuff().
*/
struct Image InactiveDiskImage =
{
0, 0,
18, 12, 2,
NULL,
0x03, 0x00,
NULL
};
struct Image ActiveDiskImage =
{
-1, -1,
15, 13, 1,
NULL,
0x01, 0x00,
NULL
};
struct Image SelDiskImage =
{
0, 0,
18, 12, 2,
NULL,
0x03, 0x00,
NULL
};
#if 0
struct Image DiskImage =
{
0, 0,
18, 13, 1,
NULL,
0x01, 0x00,
NULL
};
#endif
struct Image InactiveClipImage =
{
0, 0,
18, 13, 2,
NULL,
0x03, 0x00,
NULL
};
struct Image ActiveClipImage =
{
-1, 0,
15, 14, 1,
NULL,
0x01, 0x00,
NULL
};
struct Image SelClipImage =
{
0, 0,
18, 13, 2,
NULL,
0x03, 0x00,
NULL
};
struct Gadget DiskGad =
{
NULL,
-12, 10,
10, 12,
GADGIMAGE | GRELRIGHT,
RIGHTBORDER | RELVERIFY,
BOOLGADGET,
(APTR) & InactiveDiskImage,
(APTR) & SelDiskImage,
NULL,
0L,
NULL,
DISKGAD,
NULL,
};
struct Gadget ClipGad =
{
NULL,
-12, 10,
10, 13,
GADGIMAGE | GRELRIGHT,
RIGHTBORDER | RELVERIFY,
BOOLGADGET,
(APTR) & InactiveClipImage,
(APTR) & SelClipImage,
NULL,
0L,
NULL,
CLIPGAD,
NULL,
};
struct Gadget VProp =
{
NULL,
-12, 10,
10, -15,
GADGHCOMP | GRELRIGHT | GRELHEIGHT,
RIGHTBORDER | GADGIMMEDIATE | FOLLOWMOUSE | RELVERIFY,
PROPGADGET,
NULL,
NULL,
NULL,
0L,
NULL,
VPROP,
NULL
};
struct Gadget HProp =
{
NULL,
4, -6,
-23, 5,
GADGHCOMP | GRELBOTTOM | GRELWIDTH,
BOTTOMBORDER | GADGIMMEDIATE | FOLLOWMOUSE | RELVERIFY,
PROPGADGET,
NULL,
NULL,
NULL,
0L,
NULL,
HPROP,
NULL
};
struct PropInfo VInfo =
{
AUTOKNOB | FREEVERT | PROPBORDERLESS,
0, 0,
MAXBODY, MAXBODY,
0, 0, 0, 0, 0, 0
};
struct PropInfo HInfo =
{
AUTOKNOB | FREEHORIZ | PROPBORDERLESS,
0, 0,
MAXBODY, MAXBODY,
0, 0, 0, 0, 0, 0
};
struct Image VImage =
{
0, 0, 0, 0, 0, NULL, 0, 0, NULL
};
struct Image HImage =
{
0, 0, 0, 0, 0, NULL, 0, 0, NULL
};
/* Window structure for snapped gfx */
struct NewWindow Nw =
{
0, 1, /* LeftEdge, TopEdge */
0, 0, /* Width, Height */
(UBYTE)-1, (UBYTE)-1, /* DetailPen, BlockPen */
NULL, /* IDCMPFlags */
WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | WINDOWSIZING | RMBTRAP,
NULL, NULL, /* FirstGadget, CheckMark */
NULL,
NULL, NULL, /* Screen, BitMap */
0, 0, /* MinWidth, MinHeight */
0, 0, /* MaxWidth, MaxHeight */
WBENCHSCREEN /* Type */
};
SHORT Coords3[5][2] =
{
{0, 0},
{74, 0},
{74, 10},
{0, 10},
{0, 0}
};
SHORT Coords2[5][2] =
{
{0, 0},
{74, 0},
{74, 10},
{0, 10},
{0, 0}
};
SHORT Coords1[5][2] =
{
{0, 0},
{34, 0},
{34, 10},
{0, 10},
{0, 0}
};
struct Border Border3 =
{
-1, -2,
1, 0,
JAM1,
5,
(SHORT *) &Coords3,
NULL
};
struct Border Border2 =
{
-1, -1,
1, 0,
JAM1,
5,
(SHORT *) &Coords2,
NULL
};
struct Border Border1 =
{
-1, -1,
1, 0,
JAM1,
5,
(SHORT *) &Coords1,
NULL
};
UBYTE TranspBuf[5];
struct StringInfo TranspSI =
{
TranspBuf, /* Buf */
NULL, /* UndoBuf */
0, /* BufferPos */
4, /* MaxChars */
0, /* DispPos */
0, /* UndoPos */
0, /* NumChars */
0, /* DispCount */
0, 0, /* CLeft, CTop */
NULL, /* Layer */
0L, /* LongInt */
NULL /* AltKeyMap */
};
struct Gadget TranspGad =
{
NULL,
5, 16,
32, 8,
LONGINT,
RELVERIFY,
STRGADGET,
(APTR) & Border3,
NULL,
NULL,
0L,
(APTR) & TranspSI,
0,
NULL,
};
IMPORT char SaveName[DSIZE + FCHARS + 2];
struct StringInfo NameSI =
{
(UBYTE *) SaveName, /* Buf */
NULL, /* UndoBuf */
0, /* BufferPos */
DSIZE + FCHARS, /* MaxChars */
0, /* DispPos */
0, /* UndoPos */
0, /* NumChars */
0, /* DispCount */
0, 0, /* CLeft, CTop */
NULL, /* Layer */
0L, /* LongInt */
NULL /* AltKeyMap */
};
struct Gadget NameGad =
{
&TranspGad,
5, 16,
32, 8,
NULL,
NULL,
NULL,
(APTR) & Border2,
NULL,
NULL,
0L,
NULL,
NAMEGAD,
NULL,
};
struct Gadget SaveGad =
{
&NameGad,
5, 16,
32, 8,
GADGHCOMP,
RELVERIFY,
BOOLGADGET,
(APTR) & Border1,
NULL,
NULL,
0L,
NULL,
SAVEGAD,
NULL,
};
/* Window structure for control window */
struct NewWindow NewCW =
{
10, 10, /* LeftEdge, TopEdge */
326, 40, /* Width, Height */
(UBYTE)-1, (UBYTE)-1, /* DetailPen, BlockPen */
NULL, /* IDCMPFlags */
WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | ACTIVATE |
SMART_REFRESH | NOCAREREFRESH | RMBTRAP,
NULL, NULL, /* FirstGadget, CheckMark */
(UBYTE *) "Snap Control Window",
NULL, NULL, /* Screen, BitMap */
32, 32, /* MinWidth, MinHeight */
(UWORD)-1, (UWORD)-1, /* MaxWidth, MaxHeight */
WBENCHSCREEN /* Type */
};
#ifdef REQLIB
IMPORT struct ReqFileRequester *NameFR;
#endif /* REQLIB */
#ifdef ASLLIB
IMPORT struct FileRequester *AslNameFR;
#endif /* ASLLIB */
struct Window *opensharedwindow(nw)
struct NewWindow *nw;
{
struct Window *win;
struct Screen scr;
if (!GetScreenData((char *)&scr, (LONG) sizeof (struct Screen),
WBENCHSCREEN, NULL))
{
return NULL; /* No WB */
}
if (nw->TopEdge + nw->Height > scr.Height)
{
nw->TopEdge = scr.Height - nw->Height;
}
if (nw->LeftEdge + nw->Width > scr.Width)
{
nw->LeftEdge = scr.Width - nw->Width;
}
if (nw->TopEdge < 0)
{
nw->TopEdge = 0;
}
if (nw->LeftEdge < 0)
{
nw->LeftEdge = 0;
}
if (nw->TopEdge + nw->Height > scr.Height)
{
nw->Height = scr.Height - nw->TopEdge;
}
if (nw->LeftEdge + nw->Width > scr.Width)
{
nw->Width = scr.Width - nw->LeftEdge;
}
nw->IDCMPFlags = NULL;
if (win = OpenWindow(nw))
{
if (!Sharedport && !(Sharedport = CreatePort(0L, 0L)))
{
return NULL;
}
win->UserPort = Sharedport;
ModifyIDCMP(win, IDCMPFLAGS);
++Sharedrefs;
}
return (win);
}
VOID closesharedwindow(win)
struct Window *win;
{
REGISTER struct IntuiMessage *im, *safe;
Forbid();
Sharedrefs--;
SAFEMAPLIST(&win->UserPort->mp_MsgList,
struct IntuiMessage *, im, safe)
{
if (im->IDCMPWindow == win)
{
Remove((struct Node *)im);
ReplyMsg((struct Message *)im);
}
}
win->UserPort = NULL;
ModifyIDCMP(win, NULL);
Permit();
CloseWindow(win);
if (!Sharedrefs)
{
DeletePort(Sharedport);
Sharedport = NULL;
}
}
VOID SetUpBorder(Border, Gad)
struct Border *Border;
struct Gadget *Gad;
{
Border->XY[2] = Border->XY[4] = Gad->Width + 1;
Border->XY[5] = Border->XY[7] = Gad->Height + 1;
}
VOID DrawOldBorders( struct GfxSnap *GS)
{
REGISTER LONG right;
REGISTER LONG bottom;
if (!Kick36)
{
right = GS->window->Width - GS->rightbar;
bottom = GS->window->Height - GS->bottombar;
SetDrMd(GS->window->RPort, JAM1);
SetAPen(GS->window->RPort, 0L);
Move(GS->window->RPort, 2L, bottom);
Draw(GS->window->RPort, right, bottom);
Move(GS->window->RPort, 2L, bottom + 2);
Draw(GS->window->RPort, right, bottom + 2);
Move(GS->window->RPort, right, (LONG) GS->topbar);
Draw(GS->window->RPort, right, bottom);
Draw(GS->window->RPort, right + 1, bottom);
Draw(GS->window->RPort, right + 1, (LONG) GS->topbar);
SetAPen(GS->window->RPort, 1L);
Move(GS->window->RPort, right + 2, (LONG) GS->topbar);
Draw(GS->window->RPort, right + 2, bottom);
Draw(GS->window->RPort, right + 3, bottom);
Draw(GS->window->RPort, right + 3, (LONG) GS->topbar);
Move(GS->window->RPort, 2L, bottom + 1);
Draw(GS->window->RPort, right + 1, bottom + 1);
}
}
VOID AdjustSize(GS)
struct GfxSnap *GS;
{
ULONG w = GS->window->Width - GS->leftbar - GS->rightbar;
ULONG h = GS->window->Height - GS->topbar - GS->bottombar;
ULONG vb, hb;
vb = hb = MAXBODY;
if (w < GS->width)
{
hb = w * (ULONG) MAXBODY / GS->width;
}
if (h < GS->height)
{
vb = h * (ULONG) MAXBODY / GS->height;
}
NewModifyProp(&GS->VProp, GS->window, NULL,
(ULONG) AUTOKNOB | FREEVERT | PROPBORDERLESS,
0L, 0L, (ULONG) MAXBODY, vb, 1L);
NewModifyProp(&GS->HProp, GS->window, NULL,
(ULONG) AUTOKNOB | FREEHORIZ | PROPBORDERLESS,
0L, 0L, hb, (ULONG) MAXBODY, 1L);
RefreshWindowFrame(GS->window);
DrawOldBorders(GS);
InitRastPort(&MyRP);
MyRP.BitMap = GS->BitMap;
SetAPen(GS->window->RPort, 0);
RectFill(GS->window->RPort,
(LONG) GS->leftbar, (LONG) GS->topbar,
(LONG) GS->leftbar + w - 1, (LONG) GS->topbar + h - 1);
if (w > GS->width)
w = GS->width;
if (h > GS->height)
h = GS->height;
ClipBlit(&MyRP, 0L, 0L, GS->window->RPort,
(LONG) GS->leftbar, (LONG) GS->topbar, w, h, 0xC0L);
}
VOID SyncGS(GS)
struct GfxSnap *GS;
{
ULONG w = GS->window->Width - GS->leftbar - GS->rightbar;
ULONG h = GS->window->Height - GS->topbar - GS->bottombar;
ULONG vpos, hpos;
LONG temp;
temp = GS->width - w;
if (temp <= 0)
{
hpos = 0;
}
else
{
hpos = temp * (LONG) GS->HInfo.HorizPot / MAXBODY;
if (hpos > temp)
{
hpos = temp;
}
}
temp = GS->height - h;
if (temp <= 0)
{
vpos = 0;
}
else
{
vpos = temp * (LONG) GS->VInfo.VertPot / MAXBODY;
if (vpos > temp)
{
vpos = temp;
}
}
DrawOldBorders(GS);
InitRastPort(&MyRP);
MyRP.BitMap = GS->BitMap;
if (w > GS->width)
{
w = GS->width;
}
if (h > GS->height)
{
h = GS->height;
}
ClipBlit(&MyRP, hpos, vpos, GS->window->RPort,
(LONG) GS->leftbar, (LONG) GS->topbar, w, h, 0xC0L);
}
SHORT OpenCW()
{
WORD temp;
struct RastPort TmpRP;
FixHeights();
InitRastPort(&TmpRP);
SetFont(&TmpRP, ScreenFont);
SaveGad.TopEdge = NameGad.TopEdge = TopBar + 2;
SaveGad.Height = NameGad.Height = TranspGad.Height = ScreenFontHeight + 2;
TranspGad.TopEdge = SaveGad.TopEdge + SaveGad.Height + 5;
SaveGad.LeftEdge = LeftBar + 2;
SaveGad.Width = TextLength(&TmpRP, "Save", 4L) + 1;
SaveGad.Flags |= GADGDISABLED;
NameGad.LeftEdge = SaveGad.LeftEdge +
TextLength(&TmpRP, "Save as ", 8L);
temp = 322 - NameGad.LeftEdge;
NameGad.Width =
temp - (temp % TextLength(&TmpRP, " ", 1L)) + 1;
TranspGad.LeftEdge = SaveGad.LeftEdge +
TextLength(&TmpRP, "Transparent color ", 18L);
TranspGad.Width = TextLength(&TmpRP, "0000", 4L) + 2;
NewCW.Height = TopBar + BottomBar + ScreenFontHeight * 2 + 12;
#define dmax(a,b) ((a>b)?a:b)
NewCW.Width = dmax((TranspGad.LeftEdge + TranspGad.Width + 2 + RightBar), (NameGad.LeftEdge + NameGad.Width + 2 + RightBar));
#undef dmax
ControlWindow = opensharedwindow(&NewCW);
if (!ControlWindow)
{
return 0;
}
SetFont(ControlWindow->RPort, ScreenFont);
ModifyIDCMP(ControlWindow, ControlWindow->IDCMPFlags & ~NEWSIZE);
SetUpBorder(&Border1, &SaveGad);
SetUpBorder(&Border2, &NameGad);
SetUpBorder(&Border3, &TranspGad);
#if defined(REQLIB) || defined(ASLLIB)
#ifdef REQLIB
#ifdef ASLLIB
if ((NameFR) || (AslNameFR))
#else /* ASLLIB */
if (NameFR)
#endif /* ASLLIB */
#else
if (AslNameFR)
#endif /* REQLIB */
{
NameGad.Flags = GADGHCOMP;
NameGad.Activation = RELVERIFY;
NameGad.GadgetType = BOOLGADGET;
NameGad.SpecialInfo = NULL;
}
else
#endif /* REQLIB || ASLLIB */
{
NameGad.Flags = SELECTED;
NameGad.Activation = NULL;
NameGad.GadgetType = STRGADGET;
NameGad.SpecialInfo = (APTR) & NameSI;
++NameGad.LeftEdge; /* Adjust string gadget position */
++NameGad.TopEdge; /* Adjust string gadget position */
}
strcpy(SaveName, "Snap.pic");
strcpy((char *)TranspBuf, "0");
TranspSI.LongInt = 0L;
SetAPen(ControlWindow->RPort, 1L);
SetBPen(ControlWindow->RPort, 0L);
SetDrMd(ControlWindow->RPort, JAM2);
Move(ControlWindow->RPort,
(LONG) SaveGad.LeftEdge + 1,
(LONG) SaveGad.TopEdge + ControlWindow->RPort->Font->tf_Baseline + 1);
Text(ControlWindow->RPort, "Save as", 7L);
Move(ControlWindow->RPort,
(LONG) SaveGad.LeftEdge + 1,
(LONG) TranspGad.TopEdge + ControlWindow->RPort->Font->tf_Baseline);
Text(ControlWindow->RPort, "Transparent color", 17L);
AddGList(ControlWindow, &SaveGad, -1L, 3L, NULL);
RefreshGList(&SaveGad, ControlWindow, NULL, 3L);
#if defined(REQLIB) || defined(ASLLIB)
#ifdef REQLIB
#ifdef ASLLIB
if ((NameFR) || (AslNameFR))
#else /* ASLLIB */
if (NameFR)
#endif /* ASLLIB */
#else
if (AslNameFR)
#endif /* REQLIB */
{
GadText(&NameGad, SaveName, 8L);
}
else
#endif /* REQLIB || ASLLIB */
{
ActivateGadget(&NameGad, ControlWindow, NULL);
}
return 1;
}